class Stack {
    constructor() {
        this.items = []
    }
    push(elements) {
        this.items.push(elements)
    }
    pop() {
        return this.items.pop()
    }
    // 返回栈顶元素 
    peek() {
        const len = this.items.length 
        return this.items[len -1]
    }
    isEmpty() {
        return this.items.length === 0 
    }
    clear() {
        this.items = []
    }
    size() {
        return this.items.length
    }
}
// 遵循先进先出的原则  
// 俩个池子 一个池子 管进 一个池子管出 
class faskQueue {
    constructor() {
        this.StackIn = []
        // 栈 弹出的再最外面 
        this.StackOut = []
    }
    push(element) {
        this.StackIn.push(element)
    } 
    pop() {
        // 1.获取弹出的队列 弹出 第一个 
        // 或者 直接从stackIn里面加入弹出队列
        const size = this.StackOut.length
        while (size) {
            return this.StackOut.pop() 
        }
        while (this.StackIn.length) {
            this.StackOut.push(this.StackIn.pop())
        }
        return this.StackOut.pop()
    }
    peek() {
        const x = this.pop()
        this.StackOut.push(x)
        return x
    }
    empty() {
        return !this.StackIn.length && !this.StackOut.length
    }

}

class Queue {
    constructor() {
        this.queue = []
    }
    push(item) {
        this.queue.push(item)
    }
    pop() {
        return this.queue.shift()
    }
    peek() {
        if (this.empty()) return null
        return this.queue[0]
    }
    empty() {
        return this.queue.length === 0
    }
}
class fakeStack {
    constructor() {
        this.queue = []
    }
    push(x) {
        this.queue.push(x)
    }
    pop() {
        // 调换顺序
        let size = this.queue.length
        while (size > 1) {
            this.queue.push(this.queue.shift())
            size--
        }
        return this.queue.shift()
    }
    top() {
        if (this.empty()) return null 
        const x = this.pop()
        this.queue.push(x)
        return x
    }
    empty() {
        return !this.queue.length
    }
}
export {
    Stack,
    faskQueue,
    Queue,
    fakeStack
}